/************************************************************************
 * Este archivo, representa metodos y variables relacionadas con la 
 * funcionalidad de formato de tickets e impresiones
 * 
 * @system: veco-system
 * @description: Sistema de control vehicular
 * @version: 1.0
 * @Copyright © 2013 
 * 
 * @authores:
 * 
 *      > Alberione, Fernando    <falberione_037@gmail.com>
 * 
 *      > Boretto, Martin        <martinboretto@gmail.com>
 * 
 *      > Lenarduzzi, Federico   <fedeatenas@gmail.com>
 * 
 *      > Ocampo, Emanuel        <eocampo86@gmail.com>
 *
 *************************************************************************/

package SistemaCocheras;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;


public class Tickets {
    
    private Connection conexion;
    private String nombreCochera;
    private String direccionCochera;
    private String telefonoCochera;

    
    // ---------------------------------------------------------
    // ------- Seccion de constructores de la clase
    // ---------------------------------------------------------      
    
    /**
     * Constructor NO vacio
     * @param c Representa la conexion con la base de datos
     * @throws SQLException
     */
    public Tickets (Connection c) throws SQLException{
        this.conexion = c;
        manejadorCochera mco = new manejadorCochera(this.conexion);
        ResultSet cochera = mco.buscarCochera();
        if (cochera.next()){
            this.nombreCochera = cochera.getString("nombrecochera").toUpperCase();
            this.direccionCochera = cochera.getString("direccioncochera").toUpperCase();
            this.telefonoCochera = cochera.getString("telefonocochera").toUpperCase();
        }
    }


    
    // ---------------------------------------------------------
    // ------- Seccion de metodos publicos auxiliares
    // ---------------------------------------------------------
    
    /**
     * Funcion encargada de imprimir el ticket de ingreso de un vehiculo
     * @param fecha Representa la fecha del ticket a imprimir
     * @param hora Representa la hora del ticket a imprimir
     * @param dominio Representa el dominio del vehiculo
     * @param pos Representa la posicion del vehiculo
     * @throws IOException
     */
    public void imprimirTicketIngreso (String fecha, String hora, String dominio, int pos) throws IOException{
        Impresora impresora = new Impresora();
        String ticket = generarTicketIngreso(fecha, hora, dominio, pos);
        crearArchivoTicket(1, ticket);
        impresora.imprimirTicket(1);
    }// Fin imprimirTicketIngreso

    
    /**
     * Funcion encargada de imprimir el ticket de egreso de un vehiculo
     * @param datos Representa los datos del vehiculo
     * @param dominio Representa el dominio del vehiculo
     * @param fecha Representa la fecha del ticket de egreso
     * @param hora Representa la hora del ticket de egreso
     * @param monto Representa el monto a pagar
     * @throws SQLException
     * @throws IOException
     */
    public void imprimirTicketEgreso(ResultSet datos, String dominio,String fecha, String hora, 
                                     Double monto) throws SQLException, IOException{
        Impresora impresora = new Impresora();
        String ticket = generarTicketEgreso(datos, fecha, hora, dominio, monto);
        crearArchivoTicket(2, ticket);
        impresora.imprimirTicket(2);
    }// Fin imprimirTicketEgreso

    
    /**
     * Funcion encargada de imprimir el ticket de pago de un cliente
     * @param dni Representa el dni del cliente
     * @param fechaA Representa la fecha actual
     * @param fechaI Representa la fecha de inicio del periodo mensual
     * @param fechaF Representa la fecha de fin del periodo mensual
     * @param monto Representa el monto a pagar
     * @throws SQLException
     * @throws IOException
     */
    public void imprimirTicketPago(String dni, Date fechaA,Date fechaI, Date fechaF, Double monto) throws SQLException, IOException{
        Impresora impresora = new Impresora();
        String ticket = generarTicketPagoClientes(dni, fechaA, fechaI, fechaF, monto);
        crearArchivoTicket(3, ticket);
        impresora.imprimirTicket(3);
    }// Fin imprimirTicketPago
    

    /**
     * Funcion encargada de imprimir el ticket de movimientos de ingreso de caja
     * @param descripcion Representa la descripcion del ingreso
     * @param usuario Representa el usuario que realizo el movimiento
     * @param valor Representa el valor del movimiento
     * @param fecha Representa la fecha del movimiento
     * @param hora Representa la hora del movimiento
     * @throws IOException
     */
    public void imprimirTicketMovIngreso (String descripcion, String usuario, double valor, String fecha, String hora) throws IOException{
        Impresora impresora = new Impresora();
        String ticket = generarMovimientoIngreso(descripcion, usuario, valor, fecha, hora);
        crearArchivoTicket(4, ticket);
        impresora.imprimirTicket(4);
    }// Fin imprimirTicketMovIngreso

    
    /**
     * Funcion encargada de imprimir el ticket de movimientos de egreso de caja
     * @param descripcion Representa la descripcion del ingreso
     * @param usuario Representa el usuario que realizo el movimiento
     * @param valor Representa el valor del movimiento
     * @param fecha Representa la fecha del movimiento
     * @param hora Representa la hora del movimiento
     * @throws IOException
     */
    public void imprimirTicketMovEgreso (String descripcion, String usuario, double valor, String fecha, String hora) throws IOException{
        Impresora impresora = new Impresora();
        String ticket = generarMovimientoEgreso(descripcion,usuario,valor,fecha,hora);
        crearArchivoTicket(5, ticket);
        impresora.imprimirTicket(5);
    }// Fin imprimirTicketMovEgreso
    
    
    
    // ---------------------------------------------------------
    // ------- Seccion de metodos privados
    // ---------------------------------------------------------    
    
    /**
     * Funcion encargada de dar el formato al ticket de ingreso de un vehiculo
     * @param fecha Representa la fecha en la que ingreso el vehiculo
     * @param hora Representa la hora de ingreso del vehiculo
     * @param dominio Representa el dominio del vehiculo
     * @param pos Representa la posicion del vehiculo en la cochera
     * @return res
     */
    private String generarTicketIngreso (String fecha, String hora, String dominio, int pos){
        String res = acomodarEspaciosEnTicketIngreso();
        String[] parse = fecha.split("-");
        fecha = parse[2]+"/"+parse[1]+"/"+parse[0];
        res += "--------------------------------------\r\n";
        res += "        "+this.nombreCochera+"\r\n";
        if (!this.direccionCochera.equals("") ){
            res += ""+this.direccionCochera+"\r\n";
        }
        if (!this.telefonoCochera.equals("")){
            res += "TELEFONO: "+this.telefonoCochera+"\r\n"; 
        }
        res += "         INGRESO\r\n";
        res += "\r\n";
        res += "DOMINIO:  "+dominio+"\r\n";
        res += "FECHA: "+fecha+" HS: "+hora+"\r\n";
        res += "UBICACION: "+pos+"\r\n";
        res += "\r\n";
        res += "       GRACIAS POR ELEGIRNOS\r\n";
        res += "--------------------------------------\r\n\r\n";
        return res;
    }// Fin generarTicketIngreso
    
   
    /**
     * Funcion encargada de dar formato al ticket de egreso de un vehiculo
     * @param datos Representa los datos del vehiculo
     * @param fecha Representa la fecha de egreso del vehiculo
     * @param hora Representa la hora de egreso del vehiculo
     * @param dominio Representa el dominio del vehiculo
     * @param tarifa Representa el tipo de tarifa a cobrar
     * @param monto Representa el monto a abonar
     * @return res
     * @throws SQLException
     */
    private String generarTicketEgreso (ResultSet datos, String fecha, String hora, 
                                       String dominio, Double monto) throws SQLException{
        String fechaIni = datos.getString(1);
        String horaIni = datos.getString(3);
        String[] parse = fecha.split("-");
        String[] parse2 = fechaIni.split("-");
        fecha = parse[2]+"/"+parse[1]+"/"+parse[0];
        fechaIni = parse2[2]+"/"+parse2[1]+"/"+parse2[0];
        String res = "\r\n";
        res += "--------------------------------------\r\n";
        res += "        "+this.nombreCochera+"\r\n";
        if (!this.direccionCochera.equals("")){
            res += "    "+this.direccionCochera+"\r\n";
        }
        if (!this.telefonoCochera.equals("")){
            res += "TELEFONO: "+this.telefonoCochera+"\r\n";
        }
        res += "          SALIDA\r\n";
        res += "\r\n";
        res += "DOMINIO:  "+dominio+"\r\n";
        res += "FECHA DE INGRESO: "+fechaIni+"\r\n";
        res += "HORA DE INGRESO: "+horaIni+"\r\n";
        res += "FECHA DE EGRESO: "+fecha+"\r\n";
        res += "HORA DE EGRESO: "+hora+"\r\n";
        res += "\r\n";
        res += "MONTO A PAGAR: $"+monto+"\r\n";
        res += "\r\n";
        res += "     GRACIAS POR ELEGIRNOS\r\n";
        res += "    LO ESPERAMOS NUEVAMENTE\r\n";
        res += "\r\n";
        res += "--------------------------------------\r\n\r\n";
        return res;
    }// Fin generarTicketEgreso


    /**
     * Funcion encargada de darle el formato al ticket correspondiente al pago
     * de un cliente
     * @param c Representa la conexion con la base de datos
     * @param dni Representa el dni del cliente
     * @param fechaA Representa la fecha actual
     * @param fechaI Representa la fecha de inicio del periodo mensual
     * @param fechaF Representa la fecha del fin del periodo mensual
     * @param monto Representa el monto a pagar
     * @return res
     * @throws SQLException
     */
    private String generarTicketPagoClientes (String dni, Date fechaA, Date fechaI, Date fechaF, 
                                             Double monto) throws SQLException{
        String fechaActual = dateToString(fechaA);
        String fechaIniPer = dateToString(fechaI);
        String fechaFinPer = dateToString(fechaF);
        manejadorCliente mc = new manejadorCliente(this.conexion);
        ResultSet cliente = mc.buscarClientePorDni(dni);
        String res = "\r\n";
        if (cliente.next()){
            String nombre = cliente.getString("nombre")+" "+
                            cliente.getString("apellido");
            res += "--------------------------------------\r\n";
            res += "        "+this.nombreCochera+"\r\n";
            if (!this.direccionCochera.equals("")){
                res += "    "+this.direccionCochera+"\r\n";
            }
            if (!this.telefonoCochera.equals("")){
                res += "TELEFONO: "+this.telefonoCochera+"\r\n";
            }
            res += "         PAGO DE CLIENTE\r\n";
            res += "\r\n";
            res += "DNI:  \""+dni+"\"\r\n";
            res += "CLIENTE: " +nombre+"\r\n";
            res += "FECHA DE PAGO : "+fechaActual+"\r\n";
            res += "INICIO PERIODO: "+fechaIniPer+"\r\n";
            res += "FIN PERIODO: "+fechaFinPer+"\r\n";
            res += "MONTO ABONADO: $"+monto+"\r\n";
            res += "\r\n";
            res += "     GRACIAS POR ELEGIRNOS\r\n";
            res += "    LO ESPERAMOS NUEVAMENTE\r\n";
            res += "\r\n";
            res += " COMPROBANTE NO VALIDO COMO FACTURA\r\n";
            res += "--------------------------------------\r\n\r\n";
        }
        return res;
    }// Fin generarTicketPagoClientes

    
    /**
     * Funcion encargada de darle el formato al ticket de movimiento de ingreso
     * @param descripcion Representa la descripcion del movimiento
     * @param usuario Representa quien realizo el movimiento
     * @param valor Representa el valor del movimiento
     * @param fecha Representa la fecha del movimiento
     * @param hora Representa la hora del movimiento
     * @return res
     * @throws IOException
     */
    private String generarMovimientoIngreso(String descripcion, String usuario, double valor, 
                                            String fecha, String hora) throws IOException{
        String[] parse = fecha.split("-");
        fecha = parse[2]+"/"+parse[1]+"/"+parse[0];
        String res = "\r\n";
        res += "--------------------------------------\r\n";
        res += "        "+this.nombreCochera+"\r\n";
        if (!this.direccionCochera.equals("")){
            res += "    "+this.direccionCochera+"\r\n";
        }
        if (!this.telefonoCochera.equals("")){
            res += "TELEFONO: "+this.telefonoCochera+"\r\n";
        }
        res += "       MOVIMIENTO DE INGRESO\r\n";
        res += "\r\n";
        res += "USUARIO:  "+usuario+"\r\n";
        res += "FECHA: "+fecha+"\r\n";
        res += "HORA: "+hora+"\r\n";
        res += "DESCRIPCION: ";
        res += acomodarEspaciosEnMovimientosDeCaja(descripcion);
        res += "MONTO MOVIMIENTO: $"+valor+"\r\n";
        res += "\r\n";
        res += "--------------------------------------\r\n\r\n";
        return res;
    }// Fin generarMovimientoIngreso

    
    /**
     * Funcion encargada de darle el formato al ticket de movimiento de egreso
     * @param descripcion Representa la descripcion del movimiento
     * @param usuario Representa quien realizo el movimiento
     * @param valor Representa el valor del movimiento
     * @param fecha Representa la fecha del movimiento
     * @param hora Representa la hora del movimiento
     * @return res
     * @throws IOException
     */
    private String generarMovimientoEgreso(String descripcion, String usuario, double valor, 
                                           String fecha, String hora) throws IOException{
        String[] parse = fecha.split("-");
        fecha = parse[2]+"/"+parse[1]+"/"+parse[0];
        String res = "\r\n";
        res += "--------------------------------------\r\n";
        res += "        "+this.nombreCochera+"\r\n";
        if (!this.direccionCochera.equals("")){
            res += "    "+this.direccionCochera+"\r\n";
        }
        if (!this.telefonoCochera.equals("")){
            res += "TELEFONO: "+this.telefonoCochera+"\r\n";
        }
        res += "       MOVIMIENTO DE EGRESO\r\n";
        res += "\r\n";
        res += "USUARIO:  "+usuario+"\r\n";
        res += "FECHA: "+fecha+"\r\n";
        res += "HORA: "+hora+"\r\n";
        res += "DESCRIPCION: ";
        res += acomodarEspaciosEnMovimientosDeCaja(descripcion);
        res += "MONTO MOVIMIENTO: $"+valor+"\r\n";
        res += "\r\n";
        res += "--------------------------------------\r\n\r\n";
        return res;
    }// Fin generarMovimientoEgreso


    /**
     * Funcion encargada de crear el ticket correspondiente en formato de 
     * archivo de texto plano
     * @param tipo Representa el tipo de ticket a generar
     * @param s Representa la informacion que se plasmara en el ticket
     * @throws IOException
     */
    private void crearArchivoTicket (int tipo, String s) throws IOException{
        String ruta = "C:\\formato\\";
        File file = new File(ruta);
        if(!file.exists()){ 
            // Si no existe creo el directorio
            if(file.mkdir()){ 
                // Directorio creado correctamente
                System.out.println("La carpeta se ha creado");
            }
            else{
                // Error al crear el directorio
                System.out.println("La carpeta NO ha creado");
            }
        }
        ruta = crearRutaTicket(tipo);
        file = new File(ruta);
        if(!file.exists()){ // Si no existe creo el directorio
            try {
                RandomAccessFile archivo = new RandomAccessFile(file, "rw");
                archivo.close();
            } 
            catch (Exception e){
                System.out.println ("Ha ocurrido un error al crear el archivo");
            }
        }
        FileWriter fw = new FileWriter(ruta, false);
        fw.write(s);    // Escritura de la informacion en el archivo
        fw.close();     
    }// Fin crearArchivoTicket
    
    
    /**
     * Funcion encargada de generar la ruta del archivo a ser generado de 
     * acuerdo al tipo de ticket
     * @param tipoTicket Representa que tipo de ticket se creara
     * @return ruta
     */
    private String crearRutaTicket(int tipoTicket){
        String ruta = "";
        switch(tipoTicket){
            case 1: {
                ruta = "C:\\formato\\ticketIngreso.txt";
                break;
            }
            case 2: {
                ruta = "C:\\formato\\ticketEgreso.txt";
                break;
            }
            case 3: {
                ruta = "C:\\formato\\ticketPagoCliente.txt";
                break;
            }
            case 4: {
                ruta = "C:\\formato\\ticketMovimientoIngreso.txt";
                break;
            }
            case 5: {
                ruta = "C:\\formato\\ticketMovimientoEgreso.txt";
                break;
            }
        }
        return ruta;
    }// Fin crearRutaTicket
    
    
    /**
     * Funcion encargada de acomodar el mensaje de inicio de acuerdo al tamanio
     * del ticket
     * @return res
     */
    private String acomodarEspaciosEnTicketIngreso(){
        String res = "\r\n";
        String mensajeInicio = "La empresa no se responsabiliza por daño o extravio del vehiculo. "
                + " No se cobra por la guarda del coche sino por el lugar que ocupa";
        int longitud = mensajeInicio.length();
        int cantDeCortes = longitud/25;
        int i = 0;
        while (i < cantDeCortes){
            if (i == 0){
                res += mensajeInicio.substring(i*25, (i+1)*25)+"\r\n";
            }
            else {
                res += ""+mensajeInicio.substring(i*25, (i+1)*25)+"\r\n";
            }
            i++;
        }
        if (i == 0){
            res += mensajeInicio.substring(i*25, longitud)+"\r\n";
        }
        else {
            res += ""+mensajeInicio.substring(i*25, longitud)+"\r\n";
        }
        return res;
    }// Fin acomodarEspaciosEnTicket
    
    
    /**
     * Funcion encargada de acomodar la descripcion del ticket de movimiento
     * de ingreso
     * @param descripcion Representa la descripcion a acomodar
     * @return res
     */
    private String acomodarEspaciosEnMovimientosDeCaja(String descripcion){
        String res = "";
        int longitud = descripcion.length();
        int cantDeCortes = longitud/18;
        int i = 0;
        while (i < cantDeCortes){
            if (i == 0){
                res +=descripcion.substring(i*18, (i+1)*18)+"\r\n";
            }
            else {
                res += "            "+descripcion.substring(i*18, (i+1)*18)+"\r\n";
            }
            i++;
        }
        if(i == 0){
            res +=descripcion.substring(i*18, longitud)+"\r\n";
        }
        else {
            res += "            "+descripcion.substring(i*18, longitud)+"\r\n";
        }
        return res;
    }// Fin acomodarEspaciosEnMovimientoIngreso
    
    
    /**
     * Funcion encargada de convertir una fecha a un string
     * @param date Representa la fecha a convertir
     * @return res
     */
    private String dateToString (Date date){
        int anio = date.getYear()+1900;
        int mes  = date.getMonth()+1;
        String dia  = ((date.toString()).split("-"))[2];
        String res = dia+"/"+mes+"/"+anio;
        return res;
    }// Fin dateToString

}// Fin clase Tickets
